﻿#ifndef QFLOWENUM_H
#define QFLOWENUM_H

#include <QObject>
#include <QMetaEnum>

#include "FlowChart_Global.h"

namespace CVV
{

namespace FlowChart
{

class CVV_FLOWCHART_EXPORT QFlowEnum : public QObject
{
    Q_OBJECT
public:
    QFlowEnum(){}

    /**
     * @brief 这是绘制快类型枚举
     */
    enum BlockType
    {
        Algorithm,
        Branch,
        IO,
        OU,
        Process,
        Assign,
        IF,
        Pre,
        Post,
        For,
        Parallel,
        SubFlow
    };
    Q_ENUM(BlockType)

    /**
     * @brief getEnumNameByKey
     * @param enumvalue  通过枚举类型 获取对应名称字符串
     * @return 字符串名称
     */
    template<typename TEnum>
    static QString getEnumNameByKey(TEnum enumvalue){
      QMetaEnum metaEnum = QMetaEnum::fromType<TEnum>();
      return QString(metaEnum.valueToKey(enumvalue));
    }


    /**
     * @brief getEnumIndexByValue
     * @param enumvalue  枚举名称
     * @return 通过名称返回枚举索引
     */
    template<typename TEnum>
    static int getEnumIndexByValue(QString enumvalue){
         QMetaEnum metaEnum = QMetaEnum::fromType<TEnum>();
         return metaEnum.keysToValue(enumvalue.toStdString().c_str());
    }
    /**
     * @brief getEnumByValue
     * @param enumvalue  枚举名称
     * @return 通过名称返回枚举
     */
    template<typename TEnum>
    static TEnum getEnumByValue(QString enumvalue){
         QMetaEnum metaEnum = QMetaEnum::fromType<TEnum>();
         return static_cast<TEnum>(metaEnum.keysToValue(enumvalue.toStdString().c_str()));
    }

};

}

}
#endif // QFLOWENUM_H
